﻿
using System;
using System.Collections;
using System.IO;
using System.Data.SqlClient;
using System.Globalization;
using System.Runtime.Serialization;
using ProtoBuf;/*https://github.com/ServiceStack/ServiceStack/tree/master/lib*/
using ServiceStack.Text;/*https://github.com/ServiceStack/ServiceStack.Text*/
using V82;
using V82.ОбщиеОбъекты;
using V82.ДокументыСсылка;
using V82.ДокументыСсылка;
using V82.Перечисления;//Ссылка;
namespace V82.ДокументыСсылка
{
	[ProtoContract]
	[DataContract]
	public partial class ЗаявлениеАбонентаСпецоператораСвязи:ДокументСсылка,IСериализаторProtoBuf,IСериализаторJson
	{
		public static readonly Guid ГуидКласса = new Guid("b9f750d9-95cb-497f-87c0-3d888f6e3aab");
		public static readonly DateTime ВерсияКласса = DateTime.ParseExact("20120928012031.000", new string[] {"yyyyMMddHHmmss.fff"}, CultureInfo.InvariantCulture, DateTimeStyles.None);
		public static readonly long КонтрольнаяСуммаКласса = 123;
		[DataMember]
		[ProtoMember(1)]
		public Guid Ссылка {get;set;}
		[DataMember]
		[ProtoMember(2)]
		public long Версия {get;set;}
		public string ВерсияДанных {get;set;}
		/*static хэш сумма состава и порядка реквизитов*/
		/*версия класса восстановленного из пакета*/
		public bool ПометкаУдаления {get;set;}
		public DateTime Дата {get;set;}
		public DateTime ПрефиксНомера {get;set;}
		public string/*11*/ Номер {get;set;}
		public bool Проведен {get;set;}
		public string/*(32)*/ ИдентификаторДокументооборота {get;set;}//Идентификатор документооборота
		public V82.Перечисления/*Ссылка*/.ТипыЗаявленияАбонентаСпецоператораСвязи ТипЗаявления {get;set;}//Тип заявления
		public V82.Перечисления/*Ссылка*/.СтатусыЗаявленияАбонентаСпецоператораСвязи Статус {get;set;}
		public V82.СправочникиСсылка.УчетныеЗаписиДокументооборота УчетнаяЗапись {get;set;}//Учетная запись
		public object ТипОрганизации {get;set;}//Тип организации
		public string/*(12)*/ ИНН {get;set;}
		public string/*(9)*/ КПП {get;set;}
		public string/*(255)*/ ПолноеНаименование {get;set;}//Полное наименование
		public string/*(255)*/ КраткоеНаименование {get;set;}//Краткое наименование
		public bool ПризнакУполномоченногоПредставителя {get;set;}//Признак уполномоченного представителя
		public bool ПризнакКрупнейшегоНалогоплательщика {get;set;}//Признак крупнейшего налогоплательщика
		public bool ПризнакОбособленногоПодразделения {get;set;}//Признак обособленного подразделения
		public string/*(240)*/ АдресЮридический {get;set;}//Адрес юридический
		public string/*(240)*/ АдресФактический {get;set;}//Адрес фактический
		public string/*(14)*/ РегНомерПФР {get;set;}//Рег номер ПФР
		public string/*(10)*/ РегНомерФСС {get;set;}//Рег номер ФСС
		public string/*(20)*/ ТелефонОсновной {get;set;}//Телефон основной
		public string/*(20)*/ ТелефонДополнительный {get;set;}//Телефон дополнительный
		public string/*(100)*/ ЭлектроннаяПочта {get;set;}//Электронная почта
		public string/*(60)*/ ВладелецЭЦПФамилия {get;set;}//Владелец ЭЦПФамилия
		public string/*(60)*/ ВладелецЭЦПИмя {get;set;}//Владелец ЭЦПИмя
		public string/*(60)*/ ВладелецЭЦПОтчество {get;set;}//Владелец ЭЦПОтчество
		public string/*(100)*/ ВладелецЭЦПДолжность {get;set;}//Владелец ЭЦПДолжность
		public string/*(100)*/ ВладелецЭЦППодразделение {get;set;}//Владелец ЭЦППодразделение
		public V82.СправочникиСсылка.ДокументыУдостоверяющиеЛичность ВладелецЭЦПВидДокумента {get;set;}//Владелец ЭЦПВид документа
		public string/*(25)*/ ВладелецЭЦПНомерДокумента {get;set;}//Владелец ЭЦПНомер документа
		public string/*(25)*/ ВладелецЭЦПСерияДокумента {get;set;}//Владелец ЭЦПСерия документа
		public DateTime ВладелецЭЦПДатаВыдачиДокумента {get;set;}//Владелец ЭЦПДата выдачи документа
		public string/*(255)*/ ВладелецЭЦПКемВыданДокумент {get;set;}//Владелец ЭЦПКем выдан документ
		public V82.Перечисления/*Ссылка*/.ТипыВладельцевЭЦП ВладелецЭЦПТип {get;set;}//Владелец ЭЦПТип
		public V82.Перечисления/*Ссылка*/.ТипыКриптоПровайдеров ТипКриптопровайдера {get;set;}//Тип криптопровайдера
		public string/*(255)*/ ПутьКонтейнерЗакрытогоКлюча {get;set;}//Путь контейнер закрытого ключа
		public string/*(0)*/ Комментарий {get;set;}
		public string/*(0)*/ СтатусКомментарий {get;set;}//Статус комментарий
		public V82.Перечисления/*Ссылка*/.СпецоператорыСвязи СпецоператорСвязи {get;set;}//Спецоператор связи
		public V82.СправочникиСсылка.Организации Организация {get;set;}
		public DateTime ДатаОтправкиЗаявления {get;set;}//Дата отправки заявления
		public DateTime ДатаПолученияОтвета {get;set;}//Дата получения ответа
		public DateTime ДатаСозданияУчетнойЗаписи {get;set;}//Дата создания учетной записи
		public V82.СправочникиСсылка.Пользователи Ответственный {get;set;}
		public string/*(10)*/ ДополнительныйКодФСС {get;set;}//Дополнительный код ФСС
		public string/*(0)*/ НомерОсновнойПоставки1с {get;set;}//Номер основной поставки1с
		
		public ЗаявлениеАбонентаСпецоператораСвязи()
		{
		}
		
		public ЗаявлениеАбонентаСпецоператораСвязи(byte[] УникальныйИдентификатор)
		{
			using (var Подключение = new SqlConnection(СтрокаСоединения))
			{
				Подключение.Open();
				using (var Команда = Подключение.CreateCommand())
				{
					Команда.CommandText = @"Select top 1 
					_IDRRef [Ссылка]
					,_Version [Версия]
					,_Marked [ПометкаУдаления]
					,_Number [Номер]
					,_Fld24224 [ИдентификаторДокументооборота]
					,_Fld24225RRef [ТипЗаявления]
					,_Fld24226RRef [Статус]
					,_Fld24227RRef [УчетнаяЗапись]
					,_Fld24228_TYPE [ТипОрганизации_Тип],_Fld24228_RRRef [ТипОрганизации],_Fld24228_RTRef [ТипОрганизации_Вид]
					,_Fld24229 [ИНН]
					,_Fld24230 [КПП]
					,_Fld24231 [ПолноеНаименование]
					,_Fld24232 [КраткоеНаименование]
					,_Fld24233 [ПризнакУполномоченногоПредставителя]
					,_Fld24234 [ПризнакКрупнейшегоНалогоплательщика]
					,_Fld24235 [ПризнакОбособленногоПодразделения]
					,_Fld24236 [АдресЮридический]
					,_Fld24237 [АдресФактический]
					,_Fld24238 [РегНомерПФР]
					,_Fld24239 [РегНомерФСС]
					,_Fld24240 [ТелефонОсновной]
					,_Fld24241 [ТелефонДополнительный]
					,_Fld24242 [ЭлектроннаяПочта]
					,_Fld24243 [ВладелецЭЦПФамилия]
					,_Fld24244 [ВладелецЭЦПИмя]
					,_Fld24245 [ВладелецЭЦПОтчество]
					,_Fld24246 [ВладелецЭЦПДолжность]
					,_Fld24247 [ВладелецЭЦППодразделение]
					,_Fld24248RRef [ВладелецЭЦПВидДокумента]
					,_Fld24249 [ВладелецЭЦПНомерДокумента]
					,_Fld24250 [ВладелецЭЦПСерияДокумента]
					,_Fld24251 [ВладелецЭЦПДатаВыдачиДокумента]
					,_Fld24252 [ВладелецЭЦПКемВыданДокумент]
					,_Fld24253RRef [ВладелецЭЦПТип]
					,_Fld24254RRef [ТипКриптопровайдера]
					,_Fld24255 [ПутьКонтейнерЗакрытогоКлюча]
					,_Fld24256 [Комментарий]
					,_Fld24257 [СтатусКомментарий]
					,_Fld24258RRef [СпецоператорСвязи]
					,_Fld24259RRef [Организация]
					,_Fld24260 [ДатаОтправкиЗаявления]
					,_Fld24261 [ДатаПолученияОтвета]
					,_Fld24262 [ДатаСозданияУчетнойЗаписи]
					,_Fld24263RRef [Ответственный]
					,_Fld24264 [ДополнительныйКодФСС]
					,_Fld24265 [НомерОсновнойПоставки1с]
					From _Document23146(NOLOCK)
					Where _IDRRef=@УникальныйИдентификатор";
					Команда.Parameters.AddWithValue("УникальныйИдентификатор", УникальныйИдентификатор);
					using (var Читалка = Команда.ExecuteReader())
					{
						if (Читалка.Read())
						{
							//ToDo: Читать нужно через GetValues()
							Ссылка = new Guid((byte[])Читалка.GetValue(0));
							var ПотокВерсии = ((byte[])Читалка.GetValue(1));
							Array.Reverse(ПотокВерсии);
							Версия =  BitConverter.ToInt64(ПотокВерсии, 0);
							ВерсияДанных =  Convert.ToBase64String(ПотокВерсии);
							ПометкаУдаления = ((byte[])Читалка.GetValue(2))[0]==1;
							Номер = Читалка.GetString(3);
							ИдентификаторДокументооборота = Читалка.GetString(4);
							ТипЗаявления = V82.Перечисления/*Ссылка*/.ТипыЗаявленияАбонентаСпецоператораСвязи.ПустаяСсылка.Получить((byte[])Читалка.GetValue(5));
							Статус = V82.Перечисления/*Ссылка*/.СтатусыЗаявленияАбонентаСпецоператораСвязи.ПустаяСсылка.Получить((byte[])Читалка.GetValue(6));
							ИНН = Читалка.GetString(11);
							КПП = Читалка.GetString(12);
							ПолноеНаименование = Читалка.GetString(13);
							КраткоеНаименование = Читалка.GetString(14);
							ПризнакУполномоченногоПредставителя = ((byte[])Читалка.GetValue(15))[0]==1;
							ПризнакКрупнейшегоНалогоплательщика = ((byte[])Читалка.GetValue(16))[0]==1;
							ПризнакОбособленногоПодразделения = ((byte[])Читалка.GetValue(17))[0]==1;
							АдресЮридический = Читалка.GetString(18);
							АдресФактический = Читалка.GetString(19);
							РегНомерПФР = Читалка.GetString(20);
							РегНомерФСС = Читалка.GetString(21);
							ТелефонОсновной = Читалка.GetString(22);
							ТелефонДополнительный = Читалка.GetString(23);
							ЭлектроннаяПочта = Читалка.GetString(24);
							ВладелецЭЦПФамилия = Читалка.GetString(25);
							ВладелецЭЦПИмя = Читалка.GetString(26);
							ВладелецЭЦПОтчество = Читалка.GetString(27);
							ВладелецЭЦПДолжность = Читалка.GetString(28);
							ВладелецЭЦППодразделение = Читалка.GetString(29);
							ВладелецЭЦПНомерДокумента = Читалка.GetString(31);
							ВладелецЭЦПСерияДокумента = Читалка.GetString(32);
							ВладелецЭЦПДатаВыдачиДокумента = Читалка.GetDateTime(33);
							ВладелецЭЦПКемВыданДокумент = Читалка.GetString(34);
							ВладелецЭЦПТип = V82.Перечисления/*Ссылка*/.ТипыВладельцевЭЦП.ПустаяСсылка.Получить((byte[])Читалка.GetValue(35));
							ТипКриптопровайдера = V82.Перечисления/*Ссылка*/.ТипыКриптоПровайдеров.ПустаяСсылка.Получить((byte[])Читалка.GetValue(36));
							ПутьКонтейнерЗакрытогоКлюча = Читалка.GetString(37);
							Комментарий = Читалка.GetString(38);
							СтатусКомментарий = Читалка.GetString(39);
							СпецоператорСвязи = V82.Перечисления/*Ссылка*/.СпецоператорыСвязи.ПустаяСсылка.Получить((byte[])Читалка.GetValue(40));
							ДатаОтправкиЗаявления = Читалка.GetDateTime(42);
							ДатаПолученияОтвета = Читалка.GetDateTime(43);
							ДатаСозданияУчетнойЗаписи = Читалка.GetDateTime(44);
							ДополнительныйКодФСС = Читалка.GetString(46);
							НомерОсновнойПоставки1с = Читалка.GetString(47);
							//return Ссылка;
						}
						else
						{
							//return null;
						}
					}
				}
			}
		}
		
		public V82.ДокументыОбъект.ЗаявлениеАбонентаСпецоператораСвязи  ПолучитьОбъект()
		{
			var Объект = new V82.ДокументыОбъект.ЗаявлениеАбонентаСпецоператораСвязи();
			Объект._ЭтоНовый = false;
			Объект.Ссылка = Ссылка;
			Объект.Версия = Версия;
			Объект.ПометкаУдаления = ПометкаУдаления;
			Объект.Номер = Номер;
			Объект.ИдентификаторДокументооборота = ИдентификаторДокументооборота;
			Объект.ТипЗаявления = ТипЗаявления;
			Объект.Статус = Статус;
			Объект.УчетнаяЗапись = УчетнаяЗапись;
			Объект.ТипОрганизации = ТипОрганизации;
			Объект.ИНН = ИНН;
			Объект.КПП = КПП;
			Объект.ПолноеНаименование = ПолноеНаименование;
			Объект.КраткоеНаименование = КраткоеНаименование;
			Объект.ПризнакУполномоченногоПредставителя = ПризнакУполномоченногоПредставителя;
			Объект.ПризнакКрупнейшегоНалогоплательщика = ПризнакКрупнейшегоНалогоплательщика;
			Объект.ПризнакОбособленногоПодразделения = ПризнакОбособленногоПодразделения;
			Объект.АдресЮридический = АдресЮридический;
			Объект.АдресФактический = АдресФактический;
			Объект.РегНомерПФР = РегНомерПФР;
			Объект.РегНомерФСС = РегНомерФСС;
			Объект.ТелефонОсновной = ТелефонОсновной;
			Объект.ТелефонДополнительный = ТелефонДополнительный;
			Объект.ЭлектроннаяПочта = ЭлектроннаяПочта;
			Объект.ВладелецЭЦПФамилия = ВладелецЭЦПФамилия;
			Объект.ВладелецЭЦПИмя = ВладелецЭЦПИмя;
			Объект.ВладелецЭЦПОтчество = ВладелецЭЦПОтчество;
			Объект.ВладелецЭЦПДолжность = ВладелецЭЦПДолжность;
			Объект.ВладелецЭЦППодразделение = ВладелецЭЦППодразделение;
			Объект.ВладелецЭЦПВидДокумента = ВладелецЭЦПВидДокумента;
			Объект.ВладелецЭЦПНомерДокумента = ВладелецЭЦПНомерДокумента;
			Объект.ВладелецЭЦПСерияДокумента = ВладелецЭЦПСерияДокумента;
			Объект.ВладелецЭЦПДатаВыдачиДокумента = ВладелецЭЦПДатаВыдачиДокумента;
			Объект.ВладелецЭЦПКемВыданДокумент = ВладелецЭЦПКемВыданДокумент;
			Объект.ВладелецЭЦПТип = ВладелецЭЦПТип;
			Объект.ТипКриптопровайдера = ТипКриптопровайдера;
			Объект.ПутьКонтейнерЗакрытогоКлюча = ПутьКонтейнерЗакрытогоКлюча;
			Объект.Комментарий = Комментарий;
			Объект.СтатусКомментарий = СтатусКомментарий;
			Объект.СпецоператорСвязи = СпецоператорСвязи;
			Объект.Организация = Организация;
			Объект.ДатаОтправкиЗаявления = ДатаОтправкиЗаявления;
			Объект.ДатаПолученияОтвета = ДатаПолученияОтвета;
			Объект.ДатаСозданияУчетнойЗаписи = ДатаСозданияУчетнойЗаписи;
			Объект.Ответственный = Ответственный;
			Объект.ДополнительныйКодФСС = ДополнительныйКодФСС;
			Объект.НомерОсновнойПоставки1с = НомерОсновнойПоставки1с;
			return Объект;
		}
		
		private static readonly Hashtable Кэш = new Hashtable(1000);
		
		public static V82.ДокументыСсылка.ЗаявлениеАбонентаСпецоператораСвязи ВзятьИзКэша(byte[] УникальныйИдентификатор)
		{
			var УИ = new Guid(УникальныйИдентификатор);
			if (Кэш.ContainsKey(УИ))
			{
				return (V82.ДокументыСсылка.ЗаявлениеАбонентаСпецоператораСвязи)Кэш[УИ];
			}
			var Ссылка = new V82.ДокументыСсылка.ЗаявлениеАбонентаСпецоператораСвязи(УникальныйИдентификатор);
			Кэш.Add(УИ, Ссылка);
			return Ссылка;
		}
		
		public void СериализацияProtoBuf(Stream Поток)
		{
			Serializer.Serialize(Поток,this);
		}
		
		public string СериализацияJson()
		{
			return this.ToJson();
		}
		
		public string СериализацияXml()
		{
			return this.ToXml();
		}
	}
}